library(glue)

Attaching package: 㤼㸱glue㤼㸲

The following object is masked from 㤼㸱package:dplyr㤼㸲:

    collapse

There were 16 warnings (use warnings() to see them)

Define common columns

cols <- c(
  "Date",
  "Regio",
  "Period",
  "Interval",
  "Population",
  "Deaths",
  "MortalityRate")

Load historical data for flu dataset

cols.historic <-
Warning messages:
1: In readChar(file, size, TRUE) : truncating string with embedded nuls
2: In readChar(file, size, TRUE) : truncating string with embedded nuls
3: In readChar(file, size, TRUE) : truncating string with embedded nuls
4: In readChar(file, size, TRUE) : truncating string with embedded nuls
5: In readChar(file, size, TRUE) : truncating string with embedded nuls
6: In readChar(file, size, TRUE) : truncating string with embedded nuls
7: In readChar(file, size, TRUE) : truncating string with embedded nuls
8: In readChar(file, size, TRUE) : truncating string with embedded nuls
  c(
    cols,
    "Year"
  )

data.historic <- union_all(
  read_rds("../results/data.Rds") %>% select(cols.historic),
  read_rds("../results/data.spatial.Rds") %>% select(cols.historic, "RegioS") %>% mutate("Regio" = RegioS) %>% select(-"RegioS"),
)
Note: Using an external vector in selections is ambiguous.
i Use `all_of(cols.historic)` instead of `cols.historic` to silence this message.
i See <https://tidyselect.r-lib.org/reference/faq-external-vector.html>.
This message is displayed once per session.
# data.flu2018 <- data.historic %>% 
#   filter(Year == 2018 | Year == 2017) %>% 
#   group_by(Year) %>%
#   mutate(
#     LastPeriod = max(Period, na.rm = T),
#     Period = if_else(Year == 2017 & Period == LastPeriod, 0, Period),
#   ) %>%
#   ungroup() %>%
#   mutate(Year = if_else(Period == 0, 2018, Year)) %>%
#   filter(Year == 2018) %>%
#   rename(Flu2018 = MortalityRate)

Additional RIVM data

Warning in readChar(file, size, TRUE) :
  truncating string with embedded nuls
Warning in readChar(file, size, TRUE) :
  truncating string with embedded nuls
Warning in readChar(file, size, TRUE) :
  truncating string with embedded nuls
Warning in readChar(file, size, TRUE) :
  truncating string with embedded nuls
Warning in readChar(file, size, TRUE) :
  truncating string with embedded nuls
Warning in readChar(file, size, TRUE) :
  truncating string with embedded nuls
Warning in readChar(file, size, TRUE) :
  truncating string with embedded nuls
Warning in readChar(file, size, TRUE) :
  truncating string with embedded nuls
data.rivm <- read_rds("../results/rivm.Rds") %>% rename(Rivm = Deaths)

Data for 2020 corona crisis

cols.corona <-
Warning messages:
1: In readChar(file, size, TRUE) : truncating string with embedded nuls
2: In readChar(file, size, TRUE) : truncating string with embedded nuls
3: In readChar(file, size, TRUE) : truncating string with embedded nuls
4: In readChar(file, size, TRUE) : truncating string with embedded nuls
5: In readChar(file, size, TRUE) : truncating string with embedded nuls
6: In readChar(file, size, TRUE) : truncating string with embedded nuls
7: In readChar(file, size, TRUE) : truncating string with embedded nuls
8: In readChar(file, size, TRUE) : truncating string with embedded nuls
  c(
    cols,
    "ExpectedMortality", "AvgMortality", "UnexpectedMortality", "ExcessiveMortality", "Flu2018"
  )

data.corona <- union_all(
  readRDS("../results/data.corona.Rds") %>% select(cols.corona),
  readRDS("../results/data.spatial.corona.Rds") %>% select(cols.corona, "RegioS") %>% mutate("Regio" = RegioS) %>% select(-RegioS)
) %>% 
  # left_join(data.flu2018, by = c("Period", "Regio")) %>%
  full_join(data.rivm, by = c("Regio", "Date")) %>%
  drop_na(Date)
Note: Using an external vector in selections is ambiguous.
i Use `all_of(cols.corona)` instead of `cols.corona` to silence this message.
i See <https://tidyselect.r-lib.org/reference/faq-external-vector.html>.
This message is displayed once per session.
data.corona %>% filter(Regio == "NL")

Geographical entities

Warning in readChar(file, size, TRUE) :
  truncating string with embedded nuls
Warning in readChar(file, size, TRUE) :
  truncating string with embedded nuls
Warning in readChar(file, size, TRUE) :
  truncating string with embedded nuls
Warning in readChar(file, size, TRUE) :
  truncating string with embedded nuls
Warning in readChar(file, size, TRUE) :
  truncating string with embedded nuls
Warning in readChar(file, size, TRUE) :
  truncating string with embedded nuls
Warning in readChar(file, size, TRUE) :
  truncating string with embedded nuls
Warning in readChar(file, size, TRUE) :
  truncating string with embedded nuls
areas <- GET("https://opendata.arcgis.com/datasets/e1f0dd70abcb4fceabbc43412e43ad4b_0.geojson") %>% content(as = "text") %>%
  read_sf() %>%
  rename(RegioS = Gemeentecode) %>% 
  arrange(Gemeentenaam) 
No encoding supplied: defaulting to UTF-8.
write_rds(areas, "../results/plots/areas.Rds")

Create a timeline and add splines for smooth charts

data.mort
Warning messages:
1: In readChar(file, size, TRUE) : truncating string with embedded nuls
2: In readChar(file, size, TRUE) : truncating string with embedded nuls
3: In readChar(file, size, TRUE) : truncating string with embedded nuls
4: In readChar(file, size, TRUE) : truncating string with embedded nuls
5: In readChar(file, size, TRUE) : truncating string with embedded nuls
6: In readChar(file, size, TRUE) : truncating string with embedded nuls
7: In readChar(file, size, TRUE) : truncating string with embedded nuls
8: In readChar(file, size, TRUE) : truncating string with embedded nuls

Example 1

tooltip <- ("<b>{Date}</b>
Mortality rate: {floor(Value)}
{if(is.na(Absolute) "" else \"Deaths: {floor(Absolute)}\" %>% glue()}"
Error: unexpected string constant in:
"Mortality rate: {floor(Value)}
{if(is.na(Absolute) "" else \"Deaths: {floor(Absolute)}\" %>% glue()}""

Example 2

Spatial dataset

data.spatial_absolute <- areas %>% left_join(data.corona %>% filter(Interval == "month"), by = c("RegioS" = "Regio")) %>% 
    mutate(
      ActualMortality = round(MortalityRate * Population / 100000),
      ExpectedMortality = round(ExpectedMortality * Population / 100000),
      AvgMortality = round(AvgMortality * Population / 100000),
      UnexpectedMortality = round(UnexpectedMortality * Population / 100000),
      ExcessiveMortality = round(ExcessiveMortality * Population / 100000),
    ) 

write_rds(data.spatial_absolute, "../results/plots/spatial_absolute.Rds")

Example

Summary table

LS0tDQp0aXRsZTogIlByZXByb2Nlc3MgZGF0YSBmb3IgcGxvdHRpbmcgaW4gdGhlIGRhc2hib2FyZCINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCmBgYHtyfQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KGh0dHIpDQpsaWJyYXJ5KHNmKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeSh0bWFwKQ0KbGlicmFyeShwbG90bHkpDQpsaWJyYXJ5KGdsdWUpDQpgYGANCg0KIyMjIERlZmluZSBjb21tb24gY29sdW1ucw0KDQpgYGB7cn0NCmNvbHMgPC0gYygNCiAgIkRhdGUiLA0KICAiUmVnaW8iLA0KICAiUGVyaW9kIiwNCiAgIkludGVydmFsIiwNCiAgIlBvcHVsYXRpb24iLA0KICAiRGVhdGhzIiwNCiAgIk1vcnRhbGl0eVJhdGUiKQ0KYGBgDQoNCiMjIyBMb2FkIGhpc3RvcmljYWwgZGF0YSBmb3IgZmx1IGRhdGFzZXQNCg0KYGBge3J9DQpjb2xzLmhpc3RvcmljIDwtDQogIGMoDQogICAgY29scywNCiAgICAiWWVhciINCiAgKQ0KDQpkYXRhLmhpc3RvcmljIDwtIHVuaW9uX2FsbCgNCiAgcmVhZF9yZHMoIi4uL3Jlc3VsdHMvZGF0YS5SZHMiKSAlPiUgc2VsZWN0KGNvbHMuaGlzdG9yaWMpLA0KICByZWFkX3JkcygiLi4vcmVzdWx0cy9kYXRhLnNwYXRpYWwuUmRzIikgJT4lIHNlbGVjdChjb2xzLmhpc3RvcmljLCAiUmVnaW9TIikgJT4lIG11dGF0ZSgiUmVnaW8iID0gUmVnaW9TKSAlPiUgc2VsZWN0KC0iUmVnaW9TIiksDQopDQoNCiMgZGF0YS5mbHUyMDE4IDwtIGRhdGEuaGlzdG9yaWMgJT4lIA0KIyAgIGZpbHRlcihZZWFyID09IDIwMTggfCBZZWFyID09IDIwMTcpICU+JSANCiMgICBncm91cF9ieShZZWFyKSAlPiUNCiMgICBtdXRhdGUoDQojICAgICBMYXN0UGVyaW9kID0gbWF4KFBlcmlvZCwgbmEucm0gPSBUKSwNCiMgICAgIFBlcmlvZCA9IGlmX2Vsc2UoWWVhciA9PSAyMDE3ICYgUGVyaW9kID09IExhc3RQZXJpb2QsIDAsIFBlcmlvZCksDQojICAgKSAlPiUNCiMgICB1bmdyb3VwKCkgJT4lDQojICAgbXV0YXRlKFllYXIgPSBpZl9lbHNlKFBlcmlvZCA9PSAwLCAyMDE4LCBZZWFyKSkgJT4lDQojICAgZmlsdGVyKFllYXIgPT0gMjAxOCkgJT4lDQojICAgcmVuYW1lKEZsdTIwMTggPSBNb3J0YWxpdHlSYXRlKQ0KDQpgYGANCg0KIyMjIEFkZGl0aW9uYWwgUklWTSBkYXRhDQoNCmBgYHtyfQ0KZGF0YS5yaXZtIDwtIHJlYWRfcmRzKCIuLi9yZXN1bHRzL3Jpdm0uUmRzIikgJT4lIHJlbmFtZShSaXZtID0gRGVhdGhzKQ0KYGBgDQoNCiMjIyBEYXRhIGZvciAyMDIwIGNvcm9uYSBjcmlzaXMNCg0KYGBge3J9DQpjb2xzLmNvcm9uYSA8LQ0KICBjKA0KICAgIGNvbHMsDQogICAgIkV4cGVjdGVkTW9ydGFsaXR5IiwgIkF2Z01vcnRhbGl0eSIsICJVbmV4cGVjdGVkTW9ydGFsaXR5IiwgIkV4Y2Vzc2l2ZU1vcnRhbGl0eSIsICJGbHUyMDE4Ig0KICApDQoNCmRhdGEuY29yb25hIDwtIHVuaW9uX2FsbCgNCiAgcmVhZFJEUygiLi4vcmVzdWx0cy9kYXRhLmNvcm9uYS5SZHMiKSAlPiUgc2VsZWN0KGNvbHMuY29yb25hKSwNCiAgcmVhZFJEUygiLi4vcmVzdWx0cy9kYXRhLnNwYXRpYWwuY29yb25hLlJkcyIpICU+JSBzZWxlY3QoY29scy5jb3JvbmEsICJSZWdpb1MiKSAlPiUgbXV0YXRlKCJSZWdpbyIgPSBSZWdpb1MpICU+JSBzZWxlY3QoLVJlZ2lvUykNCikgJT4lIA0KICAjIGxlZnRfam9pbihkYXRhLmZsdTIwMTgsIGJ5ID0gYygiUGVyaW9kIiwgIlJlZ2lvIikpICU+JQ0KICBmdWxsX2pvaW4oZGF0YS5yaXZtLCBieSA9IGMoIlJlZ2lvIiwgIkRhdGUiKSkgJT4lDQogIGRyb3BfbmEoRGF0ZSkNCg0KZGF0YS5jb3JvbmEgJT4lIGZpbHRlcihSZWdpbyA9PSAiTkwiKQ0KYGBgDQoNCiMjIyBHZW9ncmFwaGljYWwgZW50aXRpZXMNCg0KYGBge3J9DQphcmVhcyA8LSBHRVQoImh0dHBzOi8vb3BlbmRhdGEuYXJjZ2lzLmNvbS9kYXRhc2V0cy9lMWYwZGQ3MGFiY2I0ZmNlYWJiYzQzNDEyZTQzYWQ0Yl8wLmdlb2pzb24iKSAlPiUgY29udGVudChhcyA9ICJ0ZXh0IikgJT4lDQogIHJlYWRfc2YoKSAlPiUNCiAgcmVuYW1lKFJlZ2lvUyA9IEdlbWVlbnRlY29kZSkgJT4lIA0KICBhcnJhbmdlKEdlbWVlbnRlbmFhbSkgDQoNCndyaXRlX3JkcyhhcmVhcywgIi4uL3Jlc3VsdHMvcGxvdHMvYXJlYXMuUmRzIikNCmBgYA0KDQojIyMgQ3JlYXRlIGEgdGltZWxpbmUgYW5kIGFkZCBzcGxpbmVzIGZvciBzbW9vdGggY2hhcnRzDQoNCmBgYHtyfQ0KIyBEbyBzb21lIGludGVycG9sYXRpb24NCmRhdGVzIDwtIGRhdGEuY29yb25hICU+JSBkcm9wX25hKCJQZXJpb2QiLCAiRGF0ZSIpICU+JSBkaXN0aW5jdChEYXRlKSAlPiUgcHVsbCgiRGF0ZSIpDQpmaWVsZHMgPC0gYygiTW9ydGFsaXR5UmF0ZSIsICJFeHBlY3RlZE1vcnRhbGl0eSIsICJBdmdNb3J0YWxpdHkiLCAiRmx1MjAxOCIsICJEZWF0aHNVbmV4cGVjdGVkIiwgIkRlYXRoc0Fib3ZlQXZnIiwgIlJpdm0iLCAiRGVhdGhzIikNCmRheXMgPC0gZGF0YS5mcmFtZShEYXRlID0gc2VxKG1pbihkYXRlcyksIHRvID0gbWF4KGRhdGVzKSwgYnkgPSAiZGF5cyIpKSAlPiUNCiAgY3Jvc3NpbmcoZGF0YS5jb3JvbmEgJT4lIHNlbGVjdChSZWdpbywgSW50ZXJ2YWwpICU+JSBkaXN0aW5jdCgpKSAlPiUNCiAgY3Jvc3NpbmcoZmllbGRzKSAlPiUNCiAgc2V0X25hbWVzKGMoIkRhdGUiLCAiUmVnaW8iLCAiSW50ZXJ2YWwiLCAiVmFyaWFibGUiKSkNCg0KZGF0YS5tb3J0IDwtIGRhdGEuY29yb25hICU+JSANCiAgbXV0YXRlKA0KICAgIERlYXRoc1VuZXhwZWN0ZWQgPSBVbmV4cGVjdGVkTW9ydGFsaXR5ICogUG9wdWxhdGlvbiAvIDEwMDAwMCwNCiAgICBEZWF0aHNBYm92ZUF2ZyA9IEV4Y2Vzc2l2ZU1vcnRhbGl0eSAqIFBvcHVsYXRpb24gLyAxMDAwMDAsDQogICkgJT4lDQogIGdhdGhlcigiVmFyaWFibGUiLCAiVmFsdWUiLCBmaWVsZHMpICU+JQ0KICBkcm9wX25hKFJlZ2lvLCBWYXJpYWJsZSwgRGF0ZSkgJT4lDQogIGZ1bGxfam9pbihkYXlzKSAlPiUNCiAgZ3JvdXBfYnkoUmVnaW8sIEludGVydmFsLCBWYXJpYWJsZSkgJT4lDQogIGZpbHRlcihzdW0oIWlzLm5hKFZhbHVlKSkgPiAwKSAlPiUNCiAgIyBBZGQgZGF0ZXMgb2YgZmlyc3QgYW5kIGxhc3Qgb2JzZXJ2YXRpb24gdG8gb25seSBpbnRlcnBvbGF0ZS4NCiAgbXV0YXRlKA0KICAgIERhdGUyID0gaWZfZWxzZShpcy5uYShWYWx1ZSksIGFzLkRhdGUoTkEpLCBEYXRlKSwNCiAgICBNaW5EYXRlID0gbWluKERhdGUyLCBuYS5ybSA9IFQpLA0KICAgIE1heERhdGUgPSBtYXgoRGF0ZTIsIG5hLnJtID0gVCkNCiAgKSAlPiUNCiAgZmlsdGVyKERhdGUgPj0gTWluRGF0ZSAmIERhdGUgPD0gTWF4RGF0ZSkgJT4lDQogIG11dGF0ZSgNCiAgICBJbnRlcnBvbGF0ZWQgPSBhcHByb3goRGF0ZSwgVmFsdWUsIHhvdXQ9RGF0ZSkkeSwNCiAgICBBYnNvbHV0ZSA9IGlmX2Vsc2UoVmFyaWFibGUgPT0gIk1vcnRhbGl0eVJhdGUiLCBWYWx1ZSAqIFBvcHVsYXRpb24gLyAxMDAwMDAsIGFzLmRvdWJsZShOQSkpDQogICkgJT4lDQogIHVuZ3JvdXAoKSAlPiUNCiAgc2VsZWN0KCJSZWdpbyIsICJEYXRlIiwgIlBlcmlvZCIsICJJbnRlcnZhbCIsICJWYXJpYWJsZSIsICJWYWx1ZSIsICJJbnRlcnBvbGF0ZWQiLCAiQWJzb2x1dGUiKQ0KDQpkYXRhLm1vcnQgJT4lIGZpbHRlcihSZWdpbyA9PSAiTkwiLCBWYXJpYWJsZSA9PSAiUml2bSIpICU+JSBhcnJhbmdlKERhdGUpDQoNCndyaXRlX3JkcyhkYXRhLm1vcnQsICIuLi9yZXN1bHRzL3Bsb3RzL21vcnRvdmVydGltZS5SZHMiKQ0KYGBgDQoNCiMjIyMgRXhhbXBsZSAxDQoNCmBgYHtyIHB1cmw9Rn0NCnggPC0gZGF0YS5tb3J0ICU+JQ0KICBmaWx0ZXIoVmFyaWFibGUgJWluJSBjKCJNb3J0YWxpdHlSYXRlIiwgIkV4cGVjdGVkTW9ydGFsaXR5IiwgIkF2Z01vcnRhbGl0eSIsICJGbHUyMDE4IikpICU+JQ0KICBmaWx0ZXIoUmVnaW8gPT0gIk5MIikNCg0KdG9vbHRpcCA8LSAoIjxiPntEYXRlfTwvYj4NCk1vcnRhbGl0eSByYXRlOiB7Zmxvb3IoVmFsdWUpfQ0Ke0RlYXRoczoge2Zsb29yKEFic29sdXRlKX0iDQopDQoNCmdncGxvdGx5KHRvb2x0aXAgPSAidGV4dCIsIGdncGxvdCgNCiAgICAgIHgsDQogICAgICBhZXMoDQogICAgICAgIGdyb3VwID0gVmFyaWFibGUsDQogICAgICAgIGNvbG9yID0gVmFyaWFibGUsDQogICAgICAgIHRleHQgPSB0b29sdGlwICU+JSBnbHVlKCkNCiAgICAgICkNCiAgICApICsNCiAgICAgIGdlb21fcG9pbnQoYWVzKHggPSBEYXRlLCB5ID0gVmFsdWUpKSArDQogICAgICBnZW9tX2xpbmUoYWVzKHggPSBEYXRlLCB5ID0gSW50ZXJwb2xhdGVkKSkgKw0KICAgICAgbGFicyh4ID0gIlBlcmlvZCAod2Vla3MpIiAlPiUgZ2x1ZSgpLCB5ID0gIkRlYXRocyBieSAxMDAuMDAwIGluaGFiaXRhbnRzIikgKw0KICAgICAgdGhlbWVfbWluaW1hbCgpICsNCiAgICAgIHRoZW1lKGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSkNCikNCmBgYA0KDQojIyMjIEV4YW1wbGUgMg0KDQpgYGB7ciBwdXJsPUZ9DQp4IDwtIGRhdGEubW9ydCAlPiUgDQogIGZpbHRlcihWYXJpYWJsZSAlaW4lIGMoIlJpdm0iLCAiRGVhdGhzQWJvdmVBdmciLCAiRGVhdGhzVW5leHBlY3RlZCIpKSAlPiUNCiAgZmlsdGVyKFJlZ2lvID09ICJOTCIpDQoNCg0KdG9vbHRpcCA8LSAoIjxiPntEYXRlfTwvYj4NCkRlYXRoczoge2Zsb29yKEludGVycG9sYXRlZCl9IikNCg0KZ2dwbG90bHkoZ2dwbG90KA0KICB4LA0KICBhZXMoDQogICAgZ3JvdXAgPSBWYXJpYWJsZSwNCiAgICBjb2xvciA9IFZhcmlhYmxlLA0KICAgIHRleHQgPSAgdG9vbHRpcCAlPiUgZ2x1ZSgpDQogICkNCikgKw0KICBnZW9tX2xpbmUoYWVzKHggPSBEYXRlLCB5ID0gSW50ZXJwb2xhdGVkKSkgKw0KICBnZW9tX3BvaW50KGFlcyh4ID0gRGF0ZSwgeSA9IFZhbHVlKSkgKw0KICBsYWJzKHggPSAiUGVyaW9kICh3ZWVrcykiICU+JSBnbHVlKCksIHkgPSAiQWJzb2x1dGUgZGVhdGhzIikgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZShsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCkpICsNCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiU2V0MiIpLA0KDQogIHRvb2x0aXAgPSAidGV4dCINCikNCmBgYA0KDQojIyMgU3BhdGlhbCBkYXRhc2V0DQoNCmBgYHtyfQ0KZGF0YS5zcGF0aWFsX2Fic29sdXRlIDwtIGFyZWFzICU+JSBsZWZ0X2pvaW4oZGF0YS5jb3JvbmEgJT4lIGZpbHRlcihJbnRlcnZhbCA9PSAibW9udGgiKSwgYnkgPSBjKCJSZWdpb1MiID0gIlJlZ2lvIikpICU+JSANCiAgICBtdXRhdGUoDQogICAgICBBY3R1YWxNb3J0YWxpdHkgPSByb3VuZChNb3J0YWxpdHlSYXRlICogUG9wdWxhdGlvbiAvIDEwMDAwMCksDQogICAgICBFeHBlY3RlZE1vcnRhbGl0eSA9IHJvdW5kKEV4cGVjdGVkTW9ydGFsaXR5ICogUG9wdWxhdGlvbiAvIDEwMDAwMCksDQogICAgICBBdmdNb3J0YWxpdHkgPSByb3VuZChBdmdNb3J0YWxpdHkgKiBQb3B1bGF0aW9uIC8gMTAwMDAwKSwNCiAgICAgIFVuZXhwZWN0ZWRNb3J0YWxpdHkgPSByb3VuZChVbmV4cGVjdGVkTW9ydGFsaXR5ICogUG9wdWxhdGlvbiAvIDEwMDAwMCksDQogICAgICBFeGNlc3NpdmVNb3J0YWxpdHkgPSByb3VuZChFeGNlc3NpdmVNb3J0YWxpdHkgKiBQb3B1bGF0aW9uIC8gMTAwMDAwKSwNCiAgICApIA0KDQp3cml0ZV9yZHMoZGF0YS5zcGF0aWFsX2Fic29sdXRlLCAiLi4vcmVzdWx0cy9wbG90cy9zcGF0aWFsX2Fic29sdXRlLlJkcyIpDQpgYGANCg0KIyMjIyBFeGFtcGxlDQoNCmBgYHtyfQ0KdG1fc2hhcGUoZGF0YS5zcGF0aWFsX2Fic29sdXRlICU+JSBmaWx0ZXIoUGVyaW9kID09IDQpKSArDQogIHRtX3BvbHlnb25zKA0KICAgIGNvbCA9ICJNb3J0YWxpdHlSYXRlIiwNCiAgICBpZCA9ICJHZW1lZW50ZW5hYW0iLA0KICAgIHRpdGxlID0gIk1vcnRhbGl0eSByYXRlIGJ5IG11bmljaXBhbGl0eSINCiAgKQ0KYGBgDQojIyMgU3VtbWFyeSB0YWJsZQ0KDQpgYGB7cn0NCnllYXJfaGlnaF9tb3J0IDwtIGRhdGEuaGlzdG9yaWMgJT4lIGdyb3VwX2J5KFJlZ2lvLCBZZWFyKSAlPiUgDQogIHN1bW1hcmlzZShNb3J0YWxpdHlSYXRlID0gbWVhbihNb3J0YWxpdHlSYXRlKSkgJT4lIA0KICBhcnJhbmdlKGRlc2MoTW9ydGFsaXR5UmF0ZSkpICU+JSBtdXRhdGUoVmFyaWFibGUgPSAiWWVhckhpZ2hlc3RNb3J0IiwgVmFsdWUgPSBZZWFyICU+JSBhcy5jaGFyYWN0ZXIoKSkgJT4lIA0KICBzZWxlY3QoVmFyaWFibGUsIFZhbHVlLCBSZWdpbykgJT4lDQogIHNsaWNlKDEpDQoNCmRhdGEuc3VtbWFyeSA8LSBkYXRhLm1vcnQgJT4lIA0KICAgICAgZmlsdGVyKFBlcmlvZCA+IDAgJiBWYXJpYWJsZSAlaW4lIGMoIkRlYXRocyIsICJSaXZtIiwgIkRlYXRoc0Fib3ZlQXZnIiwgIkRlYXRoc1VuZXhwZWN0ZWQiKSkgJT4lDQogICAgICB1bmlvbl9hbGwoeWVhcl9oaWdoX21vcnQpICU+JQ0KICAgICAgZ3JvdXBfYnkoUmVnaW8sIFZhcmlhYmxlKSAlPiUNCiAgICAgIHN1bW1hcmlzZShWYWx1ZSA9IGNlaWxpbmcoc3VtKFZhbHVlLCBuYS5ybSA9IFQpKSkgJT4lDQogICAgICB1bmdyb3VwKCkNCg0Kd3JpdGVfcmRzKGRhdGEuc3VtbWFyeSwgIi4uL3Jlc3VsdHMvcGxvdHMvc3VtbWFyeS5SZHMiKQ0KDQpkYXRhLnN1bW1hcnkgJT4lIGZpbHRlcihSZWdpbyA9PSAiR00wMzQ1IikgJT4lIHNwcmVhZChWYXJpYWJsZSwgVmFsdWUpDQpgYGANCg0K